package com.crl.module.code.custom
{
	import flash.display.BitmapData;
	import flash.utils.ByteArray;
	
	import mx.graphics.codec.JPEGEncoder;
	/**
	 * 
	 * @author crl;
	 * 
	 * eg
	 *		var metas:ByteArray=new ByteArray();
			metas.writeUTF("crl");
			metas.position=0;
			
			var data:AJpegData=new AJpegData(bitmap.bitmapData,metas);
			
			var encoder:AJpegEncoder=new AJpegEncoder();
			
			var bytes:ByteArray=encoder.encode(data,3);
			
			var totalSize:Number=bytes.length/1024;
			
			outs=StringUtil.substitute("encode complete total size : {0}k ",totalSize.toFixed(2));
			trace(outs);
	 * 
	 */	
	public class AJpegEncoder
	{
		public function AJpegEncoder()
		{
		}
		
		public function encode(data:AJpegData,quality:int=50):ByteArray{
			var bitmapdata:BitmapData=data.png;
			var meta:ByteArray=data.meta;
			
			var bytes:ByteArray=new ByteArray();
			bytes.writeUnsignedInt(AJpegData.HEAD);
			
			var tembyt:ByteArray=this.getRGBBytes(bitmapdata,quality);
			tembyt.compress();
			var len:uint=tembyt.length
			
			//trace("rgb="+len);
			bytes.writeUnsignedInt(len);
			bytes.writeBytes(tembyt);
			
			tembyt=this.getAlphaBytes(bitmapdata);
			tembyt.compress();
			len=tembyt.length;
			
			//trace("alpha="+len);
			bytes.writeUnsignedInt(len);
			bytes.writeBytes(tembyt);
			
			bytes.writeBytes(meta);
			//trace("meta="+meta.length)
			
			bytes.position=0;
			return bytes;
		}
		private function getRGBBytes(bitmapData:BitmapData,quality:Number):ByteArray{
			var jpg:JPEGEncoder=new JPEGEncoder(quality);
			var bytes:ByteArray=jpg.encode(bitmapData);
			return bytes;
		}
		
		private function getAlphaBytes(bitmapdata:BitmapData):ByteArray{
			var alphas:ByteArray=new ByteArray();
			
			var w:int=bitmapdata.width;
			var h:int=bitmapdata.height;
			var clr:uint;
			var i:int=0,j:int=0;
			while(i<w){
				j=0;
				while(j<h){
					clr=bitmapdata.getPixel32(i,j);
					alphas.writeByte(clr>>24);
					j++
				}
				i++;
			}
			return alphas;
		}
	}
}